Linux kernel debug技巧 | 您所在的位置:网站首页 › linux 进入config › Linux kernel debug技巧 |
kernel的source code中有很多使用pr_debug/dev_dbg输出的日志信息(例如device tree解析的代码,drivers/of/fdt.c)。默认情况下,kernel不会将这些日志输出到控制台上,比如dev_dbg定义如下: #if defined(CONFIG_DYNAMIC_DEBUG) #define dev_dbg(dev, format, ...) \ do { \ dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \ } while (0) #elif defined(DEBUG) #define dev_dbg(dev, format, arg...) \ dev_printk(KERN_DEBUG, dev, format, ##arg) #else #define dev_dbg(dev, format, arg...) \ ({ \ if (0) \ dev_printk(KERN_DEBUG, dev, format, ##arg); \ }) #endif第一种用法,如果定义了CONFIG_DYNAMIC_DEBUG,就使用动态debug机制dynamic_pr_debug(); 第二种用法,如果定义了DEBUG,就使用printk(KERN_DEBUG...) 第三种用法,默认情况下,不打印(所以默认的时候在dmesg中看不到该打印)。 第三种用法肯定不是我们想要,第一种有点复杂,今天我们就来介绍第二种用法 1)开启了DEBUG宏 方法一:最简单的打开DEBUG宏的方法是修改Makefile文件,比如我们要打开kernel/drivers/mmc/下面所有文件以及子目录下所有文件的DEBUG宏,可以在kernel/drivers/mmc/Makefile中添加如下代码,其中,如果是ccflags-y := -DDEBUG表示只打开kernel/drivers/mmc/下面的文件的DEBUG宏,但不包括子目录下的文件的DEBUG宏,而subdir-ccflags-y := -DDEBUG表示全都打开。 方法二:其实开启DEBUG宏的方法很简单,在需要pr_debug/dev_dbg输出的模块开头,直接#define DEBUG即可,切记一定要在开头,如下图所示,如果你放在某个include 头文件之后,有可能这个头文件包含是pr_debug定义的头文件printk.h,导致打印没打开。开启之后,在dmesg中就可以看到pr_debug/dev_dbg的打印了。 2)kernel printk的默认日志级别大于7 先看看默认的console打印级别: 将上图中7改为大于7的数即可,比如8: 不够打印级别的信息会被写到日志中可通过dmesg 命令来查看 |
CopyRight 2018-2019 实验室设备网 版权所有 |